package warpper;

/**
 * 包装类！
   java为基本类型提供了对应的8个包装类，目的是让基本类型可以以“对象”的形式表示
   这样Object就可以引用这些包装类

   基本类型   包装类
   int       Integer
   long      Long
   double    Double
   short     Short
   Float     Float

 */
public class IntegerDemo1 {
    public static void main(String[] args) {
        int a = 123;

        //将基本类型转换为对应的包装类:
        //Integer i1 = new Integer(a); //把a包装成对象了
        //Integer i2 = new Integer(a);
        //System.out.println(i1); //结果为123
        //System.out.println(i1==i2); //结果为false
        //System.out.println(i1.equals(i2)); //结果为true
        /**注意：i1输出的时候，系统自动调用了toString()方法，所以应该是类型@地址的形式输出
               而输出了123，那显然Integer里，toString()方法已经被重写过了！

               同理，equals结果为true，说明比较的是值而不是地址，说明Integer里该方法也已经被重写过了

               如果是我们自己写的类，比如直角坐标系的Point，那我们要自己重写这些方法
               但是Integer这种系统有的类，java都是把这些方法在类中都重写好了的！
         */

        /**
            java的Integer类推荐我们使用方法valueOf();
            该方法重用了1个字节之内的整数对象，如果整数取值在：-128~127之间，就会重用对象，减少内存开销

            下边，新的i2对象因为值和i1相同，就重用了i1对象，那么"=="的结果是true而不是false，是因为重用对象，地址还是i1的地址

            效果比较鸡肋，因为范围太小了
         */
        Integer i1=Integer.valueOf(a);
        Integer i2=Integer.valueOf(a);
        System.out.println(i1==i2);        // true
        System.out.println(i1.equals(i2)); // true

        /**
           Double的valueOf没有任何额外功能，跟new对象是一样的

           所以，平时我们都用valueOf，如果行就行，不行我们就new对象进行比较
         */
        double d=123.456;
        Double d1=Double.valueOf(d);
        Double d2=Double.valueOf(d);
        System.out.println(d1==d2);        //false
        System.out.println(d1.equals(d2)); //true

        /**
           数字类型的包装类，可以将其内部保存的基本类型值以其他数字类型返回
           数字类型之间可以互转
         */
        int i = i1.intValue();  //将i1包装类对象内部保存的整数以int形式返回
        System.out.println(i);         //123
        double dou = i1.doubleValue();
        System.out.println(dou);       //123.0
        //注意，大类型转小类型的时候虽然是自动转，但是可能会存在溢出，丢精度等问题
        byte b = i1.byteValue();       //int转byte
        System.out.println(b);
    }
}
